package net.servir.capacidades.web.controller;

//import java.text.SimpleDateFormat;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import net.servir.capacidades.model.Ambito;
import net.servir.capacidades.model.Departamento;
//import net.servir.capacidades.model.Diagnostico;
import net.servir.capacidades.model.Distrito;
import net.servir.capacidades.model.Ejecutora;
import net.servir.capacidades.model.Enumerados;
import net.servir.capacidades.model.Etapa;
import net.servir.capacidades.model.GenOption;
import net.servir.capacidades.model.Persona;
import net.servir.capacidades.model.Profesion;
import net.servir.capacidades.model.Provincia;
import net.servir.capacidades.model.Regimen;
import net.servir.capacidades.model.Responsable;
import net.servir.capacidades.model.ServicioCivil;
import net.servir.capacidades.model.ResponsableEjecutoraAmbito;
import net.servir.capacidades.model.Sistema;
import net.servir.capacidades.model.SistemaEtapa;
import net.servir.capacidades.model.Test;
import net.servir.capacidades.model.Usuario;
import net.servir.capacidades.model.jsp.JspResponsableEdicion;
import net.servir.capacidades.service.CapacidadesService;
import net.servir.capacidades.service.CensoService;
import net.servir.capacidades.service.MantenimientoService;
import net.servir.capacidades.util.Utilitarios;
import net.servir.capacidades.model.Estudios;
import net.servir.capacidades.model.MayorGradoAcademico;
import net.servir.capacidades.model.Snip;
//import net.servir.capacidades.model.RptResumenEjecutoraCenso;
import net.servir.capacidades.service.ws.impl.SRELServiceWSImpl;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
public class ResponsableEdicionController {

	@Autowired
	private CapacidadesService capacidadesService;
	@Autowired
	private CensoService censoService;
	@Autowired
	private MantenimientoService mantenimientoService;

	@RequestMapping("/responsableEdicion.htm")
	public @ModelAttribute("responsableEdicion")
	JspResponsableEdicion censo(HttpServletRequest request,
			HttpServletResponse response) throws Exception {

		JspResponsableEdicion obj = new JspResponsableEdicion();

		// ************************************************************
		// se obtiene el dni de la session activa
		// ************************************************************
		HttpSession session = request.getSession();
		// String cod_session = session.getId();

		String dniUsuario = null;
		if (session.getAttribute("dni") != null)
			dniUsuario = session.getAttribute("dni").toString();

		// Obtenemos los datos del responsable
		Usuario verUsuario = null;
		if (session.getAttribute("usuario") != null)
			verUsuario = (Usuario) session.getAttribute("usuario");

		if (verUsuario == null)
			throw new Exception("No se ha identificado al usuario");

		obj.setUsuario(verUsuario);
		obj.setMostrar_ambito("0");
		obj.setMostrar_btn_habilitar(0);
		obj.setMostrar_btn_validar(0);
		obj.setMostrar_grp_habilitar(0);
		obj.setMostrar_grp_validar(0);
		obj.setDesasignado(0);
		obj.setMensaje_usuario("");

		// Definimos las variables
		String dniSession = "";
		String accion = "";
		String tipoEdicion = "";
		String sender = "";
		String coddep = "";
		String codpro = "";
		String coddis = "";
		String ubigeo = "000000";
		String dni = "";
		String nombres = "";
		String apellidoPaterno = "";
		String apellidoMaterno = "";
		String telefono = "";
		String codProfesion = "";
		String codModalidad = null;
		String codRegimen = "";
		Number estadoHabilitado = 0;
		String estadoValidacion = "0";
		String codTipoDocumento = "";
		String fecNacimiento = "";
		String sexo = "";
		String correo = "";
		Number idNivelGobierno = 0;
		Number idEjecutora = null;
		Number idResponsable = 0;
		Number idSistema = 10;
		Number idAmbito = 0;
		Number idDiagnostico = null;
		Number id_sistema_etapa = 0;
		// Integer plazoBase = 3;
		Integer plazoFinal = 0;
		String ahora = "";
		String fecHabilitacion = "";
		String nombreEjecutora = "";
		String descripcionAmbito = "";
		String conAmbito = "0";
		String strfunciones_check = "";
		// Campos Nuevos
		String telefonoPersona;
		String anexo;
		String fax;
		String celular;
		String rpmrpc;
		String comentarios;
		String correo_alterno = "";
		String cod_estudios = "";
		String cod_experiencia_snip = "";
		String cod_grado_academico = "";
		String titulo_universitario;
		String funcionesPersonalizadas = "";
		String lista_funciones = "";
		// Nuevos Campos Arson 2014
		String otrosestudios = "";
		String universidad = "";
		String isFuncionesPersonalizadas = "";
		Number restaurarIdNivelGobierno = 0;

		// se obtiene el dni de la session activa
		// ************************************************************
		if (session.getAttribute("dni") != null)
			dniSession = session.getAttribute("dni").toString();

		// se obtiene el codigo de las nuevas funciones personalizadas
		// ************************************************************
		if (request.getParameter("funcioncheck") != null) {
			funcionesPersonalizadas = request.getParameter("funcioncheck")
					.toString();
		}
//		System.out.println("funcionesPersonalizadas=============");
//		System.out.println(funcionesPersonalizadas);
		// ************************************************************
		// Obtenemos los parametros generales
		// ************************************************************
		if (request.getParameter("idResponsable") != null
				&& !request.getParameter("idResponsable").toString().equals(""))
			idResponsable = Integer.parseInt(request
					.getParameter("idResponsable"));

		if (request.getParameter("codModalidad") != null
				&& !request.getParameter("codModalidad").toString().equals("0"))
			codModalidad = request.getParameter("codModalidad");

		if (request.getParameter("accion") != null
				&& !request.getParameter("accion").toString().equals(""))
			accion = request.getParameter("accion").toString();

		if (request.getParameter("tipoEdicion") != null
				&& !request.getParameter("tipoEdicion").toString().equals(""))
			tipoEdicion = request.getParameter("tipoEdicion").toString();

		if (request.getParameter("sender") != null)
			sender = request.getParameter("sender");

		if (request.getParameter("isFuncionesPersonalizadas") != null)
			isFuncionesPersonalizadas = request
					.getParameter("isFuncionesPersonalizadas");

		if (request.getParameter("id_sistema_etapa") != null
				&& !request.getParameter("id_sistema_etapa").equals(""))
			id_sistema_etapa = (Integer.parseInt(request
					.getParameter("id_sistema_etapa")));
//		System.out.println("id_sistema_etapa (1) = " + id_sistema_etapa);
		// ************************************************************
		// Obtenemos los datos de la Base de Datos
		// ************************************************************
		Responsable responsable = new Responsable();
		ServicioCivil servicioCivil = new ServicioCivil();
		LinkedList<Test> testsDiagnostico;

		if (idResponsable != null && idResponsable.intValue() > 0) {
			responsable = capacidadesService.GetResponsable(idResponsable.intValue());
			servicioCivil = capacidadesService.ObtenerServicioCivilPorDNI(responsable.getDni(), responsable.getId_persona(),responsable.getId_ambito());
			testsDiagnostico = capacidadesService.ObtenerTestDiagnoticoPorDNI(responsable.getDni(), responsable.getId_persona());
			obj.setServicioCivil(servicioCivil);
			obj.setTestsDiagnostico(testsDiagnostico);
			Integer numTestDiagnostico = testsDiagnostico.size();
			obj.setNumTestDiagnostico(numTestDiagnostico);
			if (accion == null || accion.equals("") || accion.equals("INVALIDAR") || accion.equals("HABILITAR") || accion.equals("FINALIZAR")){
				isFuncionesPersonalizadas = responsable.getIsFuncionesPersonalizadas();
				id_sistema_etapa = responsable.getId_sistema_etapa();
			}
			tipoEdicion = "EDITAR";
		} else {
			tipoEdicion = "NUEVO";
			responsable.setInscritos(0);
			//isFuncionesPersonalizadas = "2";
		}
		if (isFuncionesPersonalizadas.equals(""))
			isFuncionesPersonalizadas = responsable.getIsFuncionesPersonalizadas();;

		if (id_sistema_etapa.equals(0))
			id_sistema_etapa = responsable.getId_sistema_etapa();
		
		if (codModalidad != null)
			responsable.setCodModalidad(codModalidad);

		LinkedList<GenOption> modalidades = censoService
				.ObtenerModalidadesResponsables();
		responsable.setModalidades(modalidades);
		obj.setTipo_edicion(tipoEdicion);
		obj.setResponsable(responsable);
		obj.setIsFuncionesPersonalizadas(isFuncionesPersonalizadas);
//		System.out.println("isFuncionesPersonalizadas (1) = " + isFuncionesPersonalizadas);

		if (obj.getResponsable().getId_diagnostico() != null) {
			// Diagnostico diagnostico = new Diagnostico();
			// diagnostico =
			// capacidadesService.GetDiagnostico(responsable.getId_diagnostico());
			// obj.setDiagnostico(diagnostico);
		}

		Persona persona = new Persona();
		if (responsable != null && responsable.getDni() != null)
			persona = capacidadesService.GetPersona(responsable);
		obj.setPersona(persona);

		// Manejo de EJECUTORAS
		// se ha indicado que cada Responsable está asignado a una sóla
		// ejecutora
		List<ResponsableEjecutoraAmbito> ambitosResponsable = capacidadesService
				.ObtenerAmbitosResponsable(idResponsable);
		obj.setAmbitos_responsable(ambitosResponsable);
		for (ResponsableEjecutoraAmbito res : ambitosResponsable) {
			int estado = 0;
			if (res.getEstado_registro() != null
					&& res.getEstado_registro() != "")
				estado = Integer.parseInt(res.getEstado_registro());

			obj.setEstado_habilitado(estado);

			if (res.getPlazo() != null)
				obj.setPlazo(res.getPlazo().toString());
			// Obtiene fecha de habilitación
			obj.setFec_habilitacion(res.getFec_habilitacion());
			obj.setFec_cierre(res.getFec_cierre());
			obj.setDias_restantes(res.getDias_restantes().toString());
			obj.setFlg_service(res.getFlg_service());
			idAmbito = res.getId_ambito();
			idSistema = res.getId_sistema();
			// obj.setId_ambito(res.getId_ambito());
			// obj.setId_sistema(res.getId_sistema());
//			System.out.println("res.getFlg_service(): " + res.getFlg_service());
//			System.out.println("obj.getFlg_service(): " + obj.getFlg_service());
		}

		ahora = capacidadesService.ObtenerFechaSistema();
		obj.setAhora(ahora);

		idEjecutora = 0;
		Ejecutora ejecutora = null;

		if (accion != null & !accion.equals("")) {
			if (request.getParameter("coddep") != null
					&& !request.getParameter("coddep").equals("0"))
				coddep = request.getParameter("coddep");
			if (request.getParameter("codpro") != null
					&& !request.getParameter("codpro").equals("0")) {
				if (!accion.equals("REFRESCARDEP"))
					codpro = request.getParameter("codpro");
			}
			if (request.getParameter("coddis") != null
					&& !request.getParameter("coddis").equals("0")) {
				if (!accion.equals("REFRESCARPROV")
						&& !accion.equals("REFRESCARDEP"))
					coddis = request.getParameter("coddis");
			}
			if (request.getParameter("idNivelGobierno") != null
					&& request.getParameter("idNivelGobierno") != "0")
				idNivelGobierno = Integer.parseInt(request
						.getParameter("idNivelGobierno"));
		}
		ubigeo = coddep + codpro + coddis;

		for (ResponsableEjecutoraAmbito ejecutoraAmbito : ambitosResponsable) {
			idEjecutora = ejecutoraAmbito.getId_ejecutora();
		}

		if (responsable.getId_ejecutora() == null)
			responsable.setId_ejecutora(0);

		if (responsable.getId_ejecutora().intValue() == 0) {
			responsable.setAsignado("0");
			// Acciones RESPONSABLE NUEVO O RESPONSABLE DESASIGNADO
			if (request.getParameter("idEjecutora") != null	&& !request.getParameter("idEjecutora").equals("0"))
				idEjecutora = Integer.parseInt(request.getParameter("idEjecutora"));
			// Cargas Ejecutoras a partir del filtro de UBIGEO y NIVEL DE
			// GOBIERNO
			if (!ubigeo.equals("") || idNivelGobierno.intValue() > 0) {
				LinkedList<Ejecutora> ejecutoras = capacidadesService.ObtenerEjecutorasNivelGobierno(idNivelGobierno.intValue(), ubigeo, 0);
				obj.setEjecutoras(ejecutoras);
			}
		} else {
			responsable.setAsignado("1");
		}

		if (request.getParameter("idEjecutoraNueva") != null
				&& !request.getParameter("idEjecutoraNueva").equals("")) {
			idEjecutora = Integer.parseInt(request.getParameter("idEjecutoraNueva"));
			responsable.setId_ejecutora(idEjecutora);
		}

		if (responsable.getId_ejecutora().intValue() > 0 || accion.equals("REFRESCAREJECUTORA")) {
//			System.out.println("responsable.getId_ejecutora() : " + responsable.getId_ejecutora());
			if (!idEjecutora.equals(0)) {
				ejecutora = capacidadesService.GetEjecutora(idEjecutora);
				if (ejecutora != null) {
					ubigeo = ejecutora.getUbigeo();
					idNivelGobierno = ejecutora.getId_nivel_gobierno();

					List<Etapa> etapasNivelGobierno = null;
					int nro_funcionesP = 0;

					// if(idResponsable.equals(0)){
					etapasNivelGobierno = capacidadesService.ObtenerEtapasNivelGobiernoSA(idNivelGobierno,idEjecutora,isFuncionesPersonalizadas,id_sistema_etapa);
					nro_funcionesP = capacidadesService.ObtenerNroFuncionesP(idNivelGobierno, idEjecutora);
					// }else{
					// nro_funcionesP =
					// capacidadesService.ObtenerNroFuncionesP(idNivelGobierno,idEjecutora);
					// etapasNivelGobierno=
					// capacidadesService.ObtenerEtapasNivelGobiernoSA(idNivelGobierno,idEjecutora,isFuncionesPersonalizadas,id_sistema_etapa);
					// }

					if (nro_funcionesP > 0) {
						obj.setCantida_funcionesP(nro_funcionesP);
					} else {
						obj.setCantida_funcionesP(0);
					}

					boolean tieneOperadores = capacidadesService
							.TieneOperadoresAsignados(idEjecutora);
					if (tieneOperadores) {
						obj.setTiene_Operadores(1);
					} else {
						obj.setTiene_Operadores(0);
					}
					obj.setEtapasNivelGobierno(etapasNivelGobierno);
				}

				if (ubigeo != null && !ubigeo.equals("")) {
					coddep = ubigeo.substring(0, 2);
					codpro = ubigeo.substring(2, 4);
					coddis = ubigeo.substring(4, 6);
				}
				if (idNivelGobierno != null)
					obj.setEjecutoras(capacidadesService
							.ObtenerEjecutorasNivelGobierno(
									idNivelGobierno.intValue(), ubigeo, 0));
			}
		}

		if (ejecutora == null) {
			ejecutora = new Ejecutora();
			ejecutora.setId_ejecutora(0);
		}

		obj.setEjecutora(ejecutora);
		if (ejecutora != null)
			nombreEjecutora = ejecutora.getDescripcion();

		// ---jp---
		obj.setId_nivel_gobierno(idNivelGobierno);
		// --- jp ---

		obj.setNombre_ejecutora(nombreEjecutora);
		// cargo controles del formulario
		obj.setNivelGobiernos(capacidadesService.ObtenerNivelGobiernos());
		obj.setProfesions(capacidadesService.ObtenerProfesion());
		obj.setRegimens(capacidadesService.ObtenerRegimen());
		obj.setTipoDocumentos(capacidadesService.ObtenerTipoDocumento());
		obj.setSistemas(capacidadesService.ObtenerSistema());
		// obj.setDiagnosticos(capacidadesService.ObtenerDiagnosticos());
		LinkedList<Departamento> departamentos = capacidadesService
				.ObtenerDepartamentos();
		obj.setDepartamentos(departamentos);
		LinkedList<Provincia> provincias = new LinkedList<Provincia>();
		if (coddep != null)
			provincias = capacidadesService.ObtenerProvincias(coddep);
		obj.setProvincias(provincias);
		LinkedList<Distrito> distritos = new LinkedList<Distrito>();
		if (coddep != null && codpro != null)
			distritos = capacidadesService.ObtenerDistritos(coddep, codpro);
		obj.setDistritos(distritos);
		obj.setCoddep(coddep);
		obj.setCodpro(codpro);
		obj.setCoddis(coddis);

		//obj.setIsFuncionesPersonalizadas(isFuncionesPersonalizadas);

		// --jp--- carga datos combo
		LinkedList<Estudios> estudios = capacidadesService.ObtenerEstudios();
		LinkedList<MayorGradoAcademico> mayorGradoAcademico = capacidadesService
				.ObtenerMayorGradoAcademico();
		LinkedList<Snip> obtenerSnip = capacidadesService.ObtenerSnip();
		LinkedList<SistemaEtapa> listaSistemaEtapa = capacidadesService
				.ObtenerSistemaEtapa();
		String tituloUniversitario = capacidadesService
				.ObtenerTituloUniversitario(1);
		// --- fin ---
		// ************************************************************
		// Obtenemos los datos del formulario
		// ************************************************************
		dni = request.getParameter("dni");
		apellidoPaterno = request.getParameter("apellidosPaterno");
		apellidoMaterno = request.getParameter("apellidosMaterno");
		nombres = request.getParameter("nombres");
		codTipoDocumento = request.getParameter("codTipoDocumento");

		correo = request.getParameter("correo");
		if (request.getParameter("correo") != null) {
			correo = correo.toLowerCase();
		}

		sexo = request.getParameter("sexo");
		fecNacimiento = request.getParameter("fecNacimiento");

		telefonoPersona = request.getParameter("telefonoPersona");
		anexo = request.getParameter("anexo");
		fax = request.getParameter("fax");
		celular = request.getParameter("celular");
		rpmrpc = request.getParameter("rpmrpc");
		comentarios = request.getParameter("comentarios");

		correo_alterno = request.getParameter("tcorreo_alternativo");
		if (request.getParameter("tcorreo_alternativo") != null) {
			correo_alterno = correo_alterno.toLowerCase();
		}

		cod_estudios = request.getParameter("lestudios");
		cod_experiencia_snip = request.getParameter("lanioexperienciasnip");
		cod_grado_academico = request.getParameter("lgradoacademico");
		titulo_universitario = request.getParameter("ctitulouniversitario");

		if (request.getParameter("telefono") != null) {
			telefono = request.getParameter("telefono");
			ejecutora.setTelefono(telefono);
			responsable.setTelefono(telefono);
		}

		if (request.getParameter("codRegimen") != null
				&& request.getParameter("codRegimen") != "")
			codRegimen = request.getParameter("codRegimen");
		if (request.getParameter("codProfesion") != null
				&& request.getParameter("codProfesion") != "")
			codProfesion = request.getParameter("codProfesion");

		// if (request.getParameter("idDiagnotico") != null &&
		// request.getParameter("idDiagnotico") != "")
		idDiagnostico = 0;// Integer.parseInt(request.getParameter("idDiagnotico"));

		// Obtener datos de nuevos campos
		if (request.getParameter("nombrepuesto") != null) {
			obj.getResponsable().setNombrepuesto(
					request.getParameter("nombrepuesto"));
		}
		if (request.getParameter("confianza") != null) {
			obj.getResponsable()
					.setConfianza(request.getParameter("confianza"));
		}
		if (request.getParameter("pertencerrhh") != null) {
			obj.getResponsable().setPertencerrhh(
					request.getParameter("pertencerrhh"));
		}
		if (request.getParameter("enadicion") != null) {
			obj.getResponsable()
					.setEnadicion(request.getParameter("enadicion"));
		}
		if (request.getParameter("estadoenpuesto") != null) {
			obj.getResponsable().setEstadoenpuesto(
					request.getParameter("estadoenpuesto"));
		}

		if (request.getParameter("otrosestudios") != null)
			obj.getResponsable().setOtrosestudios(
					request.getParameter("otrosestudios").toString());

		if (request.getParameter("universidad") != null)
			obj.getResponsable().setUniversidad(
					request.getParameter("universidad").toString());
		
		if (request.getParameter("flg_service") != null
				&& request.getParameter("flg_service") != "")
			obj.setFlg_service(Integer.parseInt(request.getParameter("flg_service")));
		
		// System.out.println("obj.getOtrosestudios() = " +
		// obj.getOtrosestudios());
		// System.out.println("obj.getUniversidad() = " + obj.getUniversidad());

		nombreEjecutora = request.getParameter("nombreEjecutora");
		/*
		 * coddep = request.getParameter("coddep"); codpro =
		 * request.getParameter("codpro"); coddis =
		 * request.getParameter("coddis");
		 */
		obj.setSistemas(capacidadesService.ObtenerSistema());

		// ---jp---
		obj.setEstudios(estudios);
		obj.setMayorGradoAcademico(mayorGradoAcademico);
		obj.setSnip(obtenerSnip);
		obj.setTitulo_universitario(tituloUniversitario);
		obj.setSistemaEtapa(listaSistemaEtapa);
		// --- fin ---
		// Obtenemos la Lista de funciones a insertar
		if (funcionesPersonalizadas == null
				|| funcionesPersonalizadas.equals("")) {
			lista_funciones = capacidadesService
					.obtenerListaFunciones(idEjecutora);
			obj.setLista_funciones(lista_funciones);
		} else {
			lista_funciones = funcionesPersonalizadas.substring(0,
					funcionesPersonalizadas.length() - 1);
			obj.setLista_funciones(lista_funciones);
		}

		// Tratamiento de Sistema y Ambitos
		if (accion != null && !accion.equals("")) { // Primera llamada de la
													// página
			if (request.getParameter("idSistema") != null
					&& !request.getParameter("idSistema").equals("0"))
				idSistema = Integer.parseInt(request.getParameter("idSistema"));
			if (request.getParameter("idAmbito") != null
					&& !request.getParameter("idAmbito").equals("0"))
				idAmbito = Integer.parseInt(request.getParameter("idAmbito"));

			if (idAmbito.intValue() == 0 && idSistema.intValue() != 0) {
				// Recuperamos el ambito del Sistema
				Sistema sistema = capacidadesService.GetSistema(idSistema);
				if (sistema != null) {
					for (Ambito ambito : sistema.getAmbitos()) {
						idAmbito = ambito.getId_ambito();
						break;
					}
				}
			}
		}

		if (idSistema.intValue() != 0) {
			Iterator itr = null;
			Sistema s = null;
			itr = obj.getSistemas().iterator();
			if (itr != null) {
				// Integer total_rows = obj.getSistemas().size();
				Integer row = 0;
				while (itr.hasNext()) {
					row += 1;
					s = (Sistema) itr.next();
					if (s.getId_sistema().intValue() == idSistema.intValue()) {
						obj.setAmbitos(capacidadesService
								.ObtenerAmbito(idSistema));
						if (s.getCon_ambitos().equals("1")) {
							conAmbito = "1";
						} else {
							// TODO para el caso de varios ambitos cambiar por
							// un select
							// por ahora esta un hide
							idAmbito = obj.getAmbitos().getFirst()
									.getId_ambito().intValue();
							descripcionAmbito = obj.getAmbitos().getFirst()
									.getDescripcion();
							obj.setDescripcionAmbito(descripcionAmbito);
						}

					}
				}
			}
		}
		obj.setMostrar_ambito(conAmbito);
		obj.setId_sistema(idSistema);
		obj.setId_ambito(idAmbito);

		if (request.getParameter("estadoValidacion") != null
				&& request.getParameter("estadoValidacion") != "")
			estadoValidacion = request.getParameter("estadoValidacion");

		if (request.getParameter("estadoHabilitado") != null
				&& request.getParameter("estadoHabilitado") != "")
			estadoHabilitado = Integer.parseInt(request
					.getParameter("estadoHabilitado"));

		fecHabilitacion = request.getParameter("fecHabilitacion");
		if (request.getParameter("plazo") != null
				&& request.getParameter("plazo") != "")
			plazoFinal = Integer.parseInt(request.getParameter("plazo"));

		Integer idPerfil = 0;
//		System.out.println("tipoEdicion = " + tipoEdicion);
		// Definimos los paneles que se van a visualizar
		if (tipoEdicion == "NUEVO") {
			obj.setMostrar_btn_habilitar(0);
			obj.setMostrar_btn_validar(0);
			obj.setMostrar_grp_habilitar(0);
			obj.setMostrar_grp_validar(0);
			obj.getPersona().setEstado_validacion("0");
		} else {
			// Verificamos el perfil del usuario.
			if (dniSession != null) {
				if (verUsuario != null) {
					idPerfil = verUsuario.getId_perfil();
					if (idPerfil <= Enumerados.AccionesResponsables.VALIDADORES
							.getCodigo()) {
						obj.setMostrar_btn_validar(1);
						obj.setMostrar_grp_validar(1);
					}
					if (idPerfil <= Enumerados.AccionesResponsables.HABILITADORES
							.getCodigo()) {
						obj.setMostrar_btn_validar(1);
						obj.setMostrar_grp_validar(1);
						if (obj.getPersona() != null
								&& "1".equals(obj.getPersona()
										.getEstado_validacion())) {
							obj.setMostrar_grp_habilitar(1);
							obj.setMostrar_btn_habilitar(1);
						}
					}
				}
			}
		}
		/*
		 * @06022013-JZM Arson Se añade validación, si Unidad Ejecutora es = 0 =
		 * Sin Ejecutora No se muestra el grupo de validación de datos
		 */
		if (obj.getEjecutora().getId_ejecutora().intValue() == 0) {
			obj.setMostrar_btn_validar(0);
			obj.setMostrar_grp_validar(0);
		}

		Responsable responsableActual = new Responsable();

		obj.setId_ambito(idAmbito);

		// INICIO: Procedemos con la acciones
//		System.out.println("INICIO de acciones : acion = " + accion);
		if (accion != null && !accion.equals("")) {
			// Actualizamos los objetos con los valores del formulario
			if (persona == null)
				persona = new Persona();
			if (responsable == null)
				responsable = new Responsable();
			if (ejecutora == null)
				ejecutora = new Ejecutora();

			obj.setPersona(persona);
			// obj.setResponsable(responsable);
			obj.setEjecutora(ejecutora);
			// obj.setEstado_habilitado(estadoHabilitado);
			obj.setFec_habilitacion(fecHabilitacion);
			if (plazoFinal != null)
				obj.setPlazo(plazoFinal.toString());

			persona.setDni(dni);
			persona.setNombres(nombres);
			persona.setApellido_paterno(apellidoPaterno);
			persona.setApellido_materno(apellidoMaterno);
			persona.setCod_tipo_doc(codTipoDocumento);
			persona.setFec_nacimiento(fecNacimiento);
			persona.setSexo(sexo);
			persona.setEstado_validacion(estadoValidacion);

			persona.setTelefono(telefonoPersona);
			if (anexo != null && !anexo.equals(""))
				persona.setAnexo(Integer.parseInt(anexo));
			if (fax != null && !fax.equals(""))
				persona.setFax(Integer.parseInt(fax));
			if (celular != null && !celular.equals(""))
				persona.setCelular(Integer.parseInt(celular));
			if (rpmrpc != null)
				persona.setRpmrpc(rpmrpc);
			persona.setComentarios(comentarios);

			responsable.setDni(dni);
			if (!codProfesion.equals("0") & !codProfesion.equals(""))
				responsable.setCod_profesion(codProfesion);

			if (!codRegimen.equals("0") & !codRegimen.equals(""))
				responsable.setCod_regimen(codRegimen);

			responsable.setCorreo(correo);
			responsable.setId_diagnostico(idDiagnostico);

			// ---jp---
			responsable.setCorreo_alterno(correo_alterno);
			responsable.setCod_estudios(cod_estudios);
			responsable.setCod_experiencia_snip(cod_experiencia_snip);
			responsable.setCod_grado_academico(cod_grado_academico);
			responsable.setTitulo_universitario(titulo_universitario);
			responsable.setId_sistema_etapa(id_sistema_etapa);
			responsable.setCod_experiencia_materia(request
					.getParameter("lanioexperienciamateria"));
			responsable.setIsFuncionesPersonalizadas(isFuncionesPersonalizadas);
//			System.out.println("id_sistema_etapa = "+id_sistema_etapa);
			// ---fin---

			ejecutora.setId_nivel_gobierno(idNivelGobierno);
			ejecutora.setId_ejecutora(idEjecutora);

			obj.setNombre_ejecutora(nombreEjecutora);

			ubigeo = coddep + codpro + coddis;
			ejecutora.setUbigeo(ubigeo);
			String ubigeoRpt = "";
			if (idNivelGobierno != null) {
				switch (idNivelGobierno.intValue()) {
				case 1: // Local distrital
					ubigeoRpt = ubigeo;
					break;
				case 2: // Nacional
					ubigeoRpt = "000000";
					break;
				case 3: // Regional
					ubigeoRpt = coddep + "0000";
					break;
				case 5: // Local Provincial
					ubigeoRpt = coddep + codpro + "00";
					break;
				default:
					ubigeoRpt = ubigeo;
					break;
				}
			}
			ejecutora.setUbigeo_rpt(ubigeoRpt);

			obj.setCoddep(coddep);
			obj.setCodpro(codpro);
			obj.setCoddis(coddis);
			obj.setProvincias(capacidadesService.ObtenerProvincias(coddep));
			obj.setDistritos(capacidadesService
					.ObtenerDistritos(coddep, codpro));
			// String redirect = "";
			boolean valido = true;

			// INICIO: obteniendo datos de persona
			if (accion.equals("OBTENERPERSONA")) {
				Persona perObtenida = capacidadesService.GetPersona(dni,
						idAmbito);
				if (perObtenida != null) {
					obj.setPersona(perObtenida);
				} else {
					/*
					 * @JZM-30042014 Arson Se añade còdigo para obtener datos de
					 * RENIEC
					 */
					// if (accion.equals("OBTENERDATOSRENIEC"))
					// {
					SRELServiceWSImpl sRELServiceWS = new SRELServiceWSImpl();
					Persona personaReniec;
					personaReniec = sRELServiceWS.getPersona(dni);
					// if (personaReniec != null) {
					if (personaReniec.getMensajeError().equals("")) {
						perObtenida = new Persona();
						if (personaReniec.getF_fallecimiento() != null) {
							perObtenida = new Persona();
							perObtenida.setNombres("");
							perObtenida.setApellido_paterno("");
							perObtenida.setApellido_materno("");
							perObtenida.setFec_nacimiento("");
							perObtenida.setEstado_validacion("0");
							obj.setPersona(perObtenida);
							obj.setMensaje_error("Persona Fallecida.");
							return obj;
						}
						perObtenida.setDni(personaReniec.getDni());
						perObtenida.setNombres(personaReniec.getNombre());
						perObtenida.setApellido_paterno(personaReniec
								.getPrimer_apellido());
						perObtenida.setApellido_materno(personaReniec
								.getSegundo_apellido());
						perObtenida.setFec_nacimiento(personaReniec
								.getF_nacimiento());
						perObtenida.setSexo(personaReniec.getSexo());
						perObtenida.setEstado_validacion("0");
						obj.setPersona(perObtenida);
					} else {
						obj.setMensaje_usuario("");
						perObtenida = new Persona();
						perObtenida.setNombres("");
						perObtenida.setApellido_paterno("");
						perObtenida.setApellido_materno("");
						perObtenida.setFec_nacimiento("");
						perObtenida.setEstado_validacion("0");
						obj.setPersona(perObtenida);
						obj.setMensaje_error(personaReniec.getMensajeError());
						return obj;
					}
				}
			}
			// FIN: obteniendo datos de persona
//			System.out.println("pasó reniec: ");

			// TODO:Validar los datos antes de grabar
			String msg = "";
			Responsable respVal;

			/*
			 * @JZM-29012013 Arson Se realiza la validación si DNI existe
			 * entonces no permite grabar los datos Setea la variable para que
			 * muestre el mensaje de Reemplazar responsable.
			 */
			if (request.getParameter("idEjecutora") != null
					&& !request.getParameter("idEjecutora").equals("0")) {
				obj.setTieneResponsable(capacidadesService
						.tieneResponsableLaEjecutora(Integer.valueOf(request
								.getParameter("idEjecutora"))));
			}

			// if (accion.equals("REFRESCAR") || accion.equals("REFRESCARDEP")
			// || accion.equals("REFRESCARPROV") ||
			// accion.equals("REFRESCAREJECUTORA") ||
			// accion.equals("REFRESCARSEC"))
			// {
			// return obj;
			// }

//			System.out.println("dni = " + dni + " idAmbito=" + idAmbito);
			respVal = capacidadesService.GetResponsablePorDNI(dni, idAmbito);
			// Validamos que no exista el responsable
			if (respVal != null) {
				Persona per = capacidadesService.GetPersona(respVal);
				if (per != null)
					msg = "El número de DNI " + dni + ", está registrado para "
							+ per.getNombreCompleto();
				valido = false;
			} else {
				// Si el responsable no existe (null) verificar si la persona
				// existe se actualizaran los datos de la persona
				Persona per = capacidadesService.GetPersona(dni, idAmbito);
				if (per != null) {
					tipoEdicion = "EDITARNUEVO";
					// persona.setId_persona(per.getId_persona());
				}
				// msg = "El responsable con " + dni + ", está registrado para "
				// + per.getNombreCompleto();
				valido = true;
			}

			// // verificar si ha cambiado el DNI
			// if
			// (!obj.getResponsable().getDni().equals(obj.getResponsable().getDniprevio())
			// & tipoEdicion.equals("EDITAR"))
			// {
			// obj.setMensaje_usuario(msg);
			// // Eliminamos los datos previos y se carga como nuevo al
			// participante
			// if (valido)
			// {
			// // NO eliminar registros -- LBN 20101109
			// //capacidadesService.EliminarParticipante(obj);
			// //tipoEdicion = "NUEVO";
			// }
			// else
			// {
			// obj.setMensaje_usuario("");
			// obj.setMensaje_error(msg);
			// return obj;
			// }
			// }

			String vaccion = accion;
			if (accion.equals("GRABAR") || accion.equals("VALIDAR")) {
				accion = "GRABAR";
			}

			// Validar cambio entidad obtener responsable por entidad
			/*
			 * if (obj.getEjecutora().getId_ejecutora() != null &&
			 * obj.getEjecutora().getId_ejecutora().intValue() > 0 &&
			 * accion.equals("GRABAR")) { respVal =
			 * capacidadesService.GetResponsablePorEjecutora
			 * (obj.getEjecutora().getId_ejecutora()); if (respVal != null) if
			 * (!respVal.getDni().equals(obj.getResponsable().getDniprevio())) {
			 * // Existe otro responsable en la entidad
			 * obj.setMensaje_usuario(""); if (respVal.getInscritos() > 1) {
			 * msg=
			 * "ALERTA: No se completó la grabación debido a que la entidad seleccionada, está asignada al responsable con DNI: "
			 * + respVal.getDni() +
			 * "; inclusive éste último, ha efectuado registro de participantes."
			 * ; } else { msg=
			 * "ALERTA: No se compleó la grabación debido a que la entidad seleccionada, está asignada al responsable con DNI: "
			 * + respVal.getDni() ; }
			 * 
			 * obj.setMensaje_error(msg); return obj;
			 * 
			 * } }
			 */
			// INICIO: Graba los datos
			if (accion.equals("GRABAR")) {
				/*
				 * @JZM-29012013 Arson Se realiza la validación si DNI existe
				 * entonces no permite grabar los datos
				 */
//				System.out.println(accion + "=========================");
//				System.out.println("Ejecutando grabar");
//				System.out.println("Buscando persona en el ambito : "
//						+ idAmbito);
				Persona personaArson;
				if (obj.getPersona().getId_persona() == null) {
					personaArson = capacidadesService.GetPersona(dni, idAmbito);
				} else {
					personaArson = capacidadesService.GetOtraPersonaPorDni(obj
							.getPersona().getId_persona().intValue(), dni,
							idAmbito);
				}

				if (personaArson != null) {
					msg = "El número de DNI " + dni + ", está registrado para "
							+ personaArson.getNombreCompleto();
					valido = false;
					obj.setMensaje_usuario("");
					obj.setMensaje_error(msg);

					List<Etapa> etapasNivelGobierno = null;
					int nro_funcionesP = 0;

					// if(idResponsable.equals(0)){
					etapasNivelGobierno = capacidadesService
							.ObtenerEtapasNivelGobiernoSA(idNivelGobierno,
									idEjecutora, isFuncionesPersonalizadas,
									id_sistema_etapa);
					nro_funcionesP = capacidadesService.ObtenerNroFuncionesP(
							idNivelGobierno, idEjecutora);
					// }else{
					// nro_funcionesP =
					// capacidadesService.ObtenerNroFuncionesP(idNivelGobierno,idEjecutora);
					// etapasNivelGobierno=
					// capacidadesService.ObtenerEtapasNivelGobiernoSA(idNivelGobierno,idEjecutora,isFuncionesPersonalizadas,id_sistema_etapa);
					// }
					//
					if (nro_funcionesP > 0) {
						obj.setCantida_funcionesP(nro_funcionesP);
					} else {
						obj.setCantida_funcionesP(0);
					}

					boolean tieneOperadores = capacidadesService
							.TieneOperadoresAsignados(idEjecutora);
					if (tieneOperadores) {
						obj.setTiene_Operadores(1);
					} else {
						obj.setTiene_Operadores(0);
					}

					obj.setEtapasNivelGobierno(etapasNivelGobierno);

					return obj;
				}
				/*
				 * @JZM-29012013 Arson Se realiza la validación si EMAIL existe
				 * entonces no permite grabar los datos
				 */
				if (obj.getPersona().getId_persona() == null) {
					personaArson = capacidadesService.GetPersonaPorEmail(
							correo, idAmbito);
				} else {
					personaArson = capacidadesService.GetOtraPersonaPorEmail(
							obj.getPersona().getId_persona().intValue(),
							correo, idAmbito);
				}

				if (personaArson != null) {
					msg = "El EMAIL " + correo + ", está registrado para "
							+ personaArson.getNombreCompleto();
					valido = false;
					obj.setMensaje_usuario("");
					obj.setMensaje_error(msg);
					return obj;
				}

				boolean actualizaResponsable = false;
				Integer idEjecutoraArson = 0;

				if (request.getParameter("idEjecutora") != null
						&& !request.getParameter("idEjecutora").equals("0")) {
					idEjecutoraArson = Integer.valueOf(request
							.getParameter("idEjecutora"));
				} else {
					idEjecutoraArson = obj.getEjecutora().getId_ejecutora()
							.intValue();
				}
//				System.out.println("idEjecutoraArson : " + idEjecutoraArson);
				if (capacidadesService
						.tieneResponsableLaEjecutora(idEjecutoraArson) > 0) {
					responsableActual = capacidadesService
							.GetResponsablePorEjecutora(idEjecutoraArson);
					responsableActual.setId_ejecutora(idEjecutoraArson);
//					System.out.println("idResponsable : " + idResponsable
//							+ "  responsableActual.getId_responsable():"
//							+ responsableActual.getId_responsable());
					if (idResponsable.intValue() == responsableActual
							.getId_responsable().intValue()) {
//						System.out.println("Es el mismo responsable");
						actualizaResponsable = false;
					} else {
//						System.out.println("Debe cambiar responsable");
						actualizaResponsable = true;
					}
				}

				if (tipoEdicion.equals("NUEVO")) {
					obj.setMensaje_usuario(msg);
					if (valido) {
						// Insertamos el responsable
						obj.getPersona().setId_persona(0);

						// funcionesPersonalizadas
						Utilitarios funcionePersonalizadasSeparadas = new Utilitarios();

						idResponsable = capacidadesService
								.grabarNuevoResponsable(
										obj,
										funcionePersonalizadasSeparadas
												.separaFuncionesPersonalizada(funcionesPersonalizadas));
						obj.setMensaje_usuario("Los datos del responsable, han sido guardados correctamente.");
						obj.setTipo_edicion("EDITAR");
						obj.getResponsable().setId_responsable(idResponsable);
						obj.getResponsable().setAsignado("1");

						List<Etapa> etapasNivelGobierno = null;
						int nro_funcionesP = 0;

						// if(idResponsable.equals(0)){
						etapasNivelGobierno = capacidadesService
								.ObtenerEtapasNivelGobiernoSA(idNivelGobierno,
										idEjecutora, isFuncionesPersonalizadas,
										id_sistema_etapa);
						nro_funcionesP = capacidadesService
								.ObtenerNroFuncionesP(idNivelGobierno,
										idEjecutora);
						// }else{
						// nro_funcionesP =
						// capacidadesService.ObtenerNroFuncionesP(idNivelGobierno,idEjecutora);
						// etapasNivelGobierno=
						// capacidadesService.ObtenerEtapasNivelGobiernoSA(idNivelGobierno,idEjecutora,isFuncionesPersonalizadas,id_sistema_etapa);
						// }

						if (nro_funcionesP > 0) {
							obj.setCantida_funcionesP(nro_funcionesP);
						} else {
							obj.setCantida_funcionesP(0);
						}

						boolean tieneOperadores = capacidadesService
								.TieneOperadoresAsignados(idEjecutora);
						if (tieneOperadores) {
							obj.setTiene_Operadores(1);
						} else {
							obj.setTiene_Operadores(0);
						}
						obj.setEtapasNivelGobierno(etapasNivelGobierno);

						// Verificamos el perfil del usuario.
						if (dniSession != null) {
							if (verUsuario != null) {
								idPerfil = verUsuario.getId_perfil();
								if (idPerfil <= Enumerados.AccionesResponsables.VALIDADORES
										.getCodigo()) {
									obj.setMostrar_btn_validar(1);
									obj.setMostrar_grp_validar(1);
								}
								if (idPerfil <= Enumerados.AccionesResponsables.HABILITADORES
										.getCodigo()) {
									obj.setMostrar_btn_validar(1);
									obj.setMostrar_grp_validar(1);
									if (obj.getPersona() != null
											&& "1".equals(obj.getPersona()
													.getEstado_validacion())) {
										obj.setMostrar_grp_habilitar(1);
										obj.setMostrar_btn_habilitar(1);
									}
								}
							}
						}

					}
				} else if (tipoEdicion.equals("EDITAR")) {
					// -- jm --
					Utilitarios funcionePersonalizadasSeparadas = new Utilitarios();
					// Actualizamos los datos del responsable
					capacidadesService
							.grabarResponsable(
									obj,
									funcionePersonalizadasSeparadas
											.separaFuncionesPersonalizada(funcionesPersonalizadas));
					obj.setMensaje_usuario("Los datos del responsable, han sido actualizados correctamente.");
					obj.getResponsable().setAsignado("1");

					List<Etapa> etapasNivelGobierno = null;
					int nro_funcionesP = 0;

					// if(idResponsable.equals(0)){
					etapasNivelGobierno = capacidadesService
							.ObtenerEtapasNivelGobiernoSA(idNivelGobierno,
									idEjecutora, isFuncionesPersonalizadas,
									id_sistema_etapa);
					nro_funcionesP = capacidadesService.ObtenerNroFuncionesP(
							idNivelGobierno, idEjecutora);
					// }else{
					// nro_funcionesP =
					// capacidadesService.ObtenerNroFuncionesP(idNivelGobierno,idEjecutora);
					// etapasNivelGobierno =
					// capacidadesService.ObtenerEtapasNivelGobiernoSA(idNivelGobierno,idEjecutora,isFuncionesPersonalizadas,id_sistema_etapa);
					// }

					if (nro_funcionesP > 0) {
						obj.setCantida_funcionesP(nro_funcionesP);
					} else {
						obj.setCantida_funcionesP(0);
					}

					boolean tieneOperadores = capacidadesService
							.TieneOperadoresAsignados(idEjecutora);
					if (tieneOperadores) {
						obj.setTiene_Operadores(1);
					} else {
						obj.setTiene_Operadores(0);
					}

					obj.setEtapasNivelGobierno(etapasNivelGobierno);

					/*
					 * @JZM-20130213 Arson Según correo de Jorge Valer Se
					 * actualiza los operadores que se encuentran en la
					 * ejecutora del responsable
					 */
					// Actualizo operadores de la ejecutora al nuevo responsable
					if (!actualizaResponsable) {
//						System.out.println("Ejecutando actualizaResponsable");
						capacidadesService.actualizarResponsableDeEjecutora(
								obj, obj.getResponsable());
					}
				} else if (tipoEdicion.equals("EDITARNUEVO")) {
					// Actualizamos los datos del responsable
					idResponsable = capacidadesService
							.grabarResponsablePersona(obj);
					obj.setMensaje_usuario("Los datos del responsable, han sido actualizados correctamente.");
					obj.getResponsable().setAsignado("1");
					obj.setId_responsable(idResponsable);
					obj.getResponsable().setId_responsable(idResponsable);
					/*
					 * @JZM-20130213 Arson Según correo de Jorge Valer Se
					 * actualiza los operadores que se encuentran en la
					 * ejecutora del responsable
					 */
					// Actualizo operadores de la ejecutora al nuevo responsable
					if (!actualizaResponsable) {
//						System.out.println("Ejecutando actualizaResponsable");
						capacidadesService.actualizarResponsableDeEjecutora(
								obj, obj.getResponsable());
					}
				}

				/*
				 * @JZM-30012013 Arson Si es un nuevo registro y la ejectura
				 * seleccionada tiene responsable, se desasigna el responsable
				 */
				if (actualizaResponsable) {
					// Invalidamos el responsable anterior
//					System.out.println("Ejecutando grabarInvalidacion");
					capacidadesService.grabarInvalidacion(
							capacidadesService.GetPersona(responsableActual),
							idEjecutora);
					// Inhabilitamos el responsable anterior
					JspResponsableEdicion objAnterior = new JspResponsableEdicion();
					objAnterior.setResponsable(responsableActual);
					objAnterior.setId_ambito(obj.getId_ambito());
//					System.out.println("Ejecutando grabarInhabilitacion");
					capacidadesService.grabarInhabilitacion(objAnterior);
					// Desasigno al responsable anterior
					censoService.grabarDesasignacion(objAnterior);

					// Actualizo operadores de la ejecutora al nuevo responsable
//					System.out.println("Ejecutando actualizaResponsable");
					capacidadesService.actualizarResponsableDeEjecutora(obj,
							responsableActual);
				}
				/*
				 * FIN
				 */

				// if (valido)
				// redirect = "responsableBusqueda.htm";
			}
			// FIN: Graba los datos

			// volvemos a seterar las variables para validacion y habilitación
//			System.out.println("idResponsable = " + idResponsable);
			if (idResponsable != null && idResponsable.intValue() > 0) {
				// Verificamos el perfil del usuario.
				if (dniSession != null) {
					if (verUsuario != null) {
						idPerfil = verUsuario.getId_perfil();
						if (idPerfil <= Enumerados.AccionesResponsables.VALIDADORES
								.getCodigo()) {
							obj.setMostrar_btn_validar(1);
							obj.setMostrar_grp_validar(1);
						}
						if (idPerfil <= Enumerados.AccionesResponsables.HABILITADORES
								.getCodigo()) {
							obj.setMostrar_btn_validar(1);
							obj.setMostrar_grp_validar(1);
							if (obj.getPersona() != null
									&& "1".equals(obj.getPersona()
											.getEstado_validacion())) {
								obj.setMostrar_grp_habilitar(1);
								obj.setMostrar_btn_habilitar(1);
							}
						}
					}
				}
			}

			accion = vaccion;
			// INICIO: Validar los datos
			if (accion.equals("VALIDAR")) {
//				System.out.println(accion + "VALIDAR=========================");
				Utilitarios funcionePersonalizadasSeparadas = new Utilitarios();
				// Actualizamos los datos del responsable
				capacidadesService
						.grabarResponsable(
								obj,
								funcionePersonalizadasSeparadas
										.separaFuncionesPersonalizada(funcionesPersonalizadas));
				
				// Validamos los datos del responsable
				capacidadesService.grabarValidacion(obj.getPersona(),
						idEjecutora);
				obj.setMensaje_usuario("Se registró la validación del usuario.");
				if (idPerfil <= Enumerados.AccionesResponsables.HABILITADORES
						.getCodigo()) {
					obj.setMostrar_grp_habilitar(1);
					obj.setMostrar_btn_habilitar(1);
				}
				obj.getPersona().setEstado_validacion(estadoValidacion);
				obj.getPersona().setFec_validacion(ahora);

				List<Etapa> etapasNivelGobierno = null;
				int nro_funcionesP = 0;

				// if(idResponsable.equals(0)){
				etapasNivelGobierno = capacidadesService
						.ObtenerEtapasNivelGobiernoSA(idNivelGobierno,
								idEjecutora, isFuncionesPersonalizadas,
								id_sistema_etapa);
				nro_funcionesP = capacidadesService.ObtenerNroFuncionesP(
						idNivelGobierno, idEjecutora);
				// }else{
				// nro_funcionesP =
				// capacidadesService.ObtenerNroFuncionesP(idNivelGobierno,idEjecutora);
				// etapasNivelGobierno=
				// capacidadesService.ObtenerEtapasNivelGobiernoSA(idNivelGobierno,idEjecutora,isFuncionesPersonalizadas,id_sistema_etapa);
				// }

				if (nro_funcionesP > 0) {
					obj.setCantida_funcionesP(nro_funcionesP);
				} else {
					obj.setCantida_funcionesP(0);
				}

				boolean tieneOperadores = capacidadesService
						.TieneOperadoresAsignados(idEjecutora);
				if (tieneOperadores) {
					obj.setTiene_Operadores(1);
				} else {
					obj.setTiene_Operadores(0);
				}

				obj.setEtapasNivelGobierno(etapasNivelGobierno);
			}
			// FIN: Validar los datos
			// INICIO: HABILITAR los datos
			if (accion.equals("HABILITAR")) {
//				System.out.println(accion + "=========================");
				// Habilitamos los datos del responsable
				censoService.grabarHabilitacion(obj);
				obj.setMensaje_usuario("Se ha habilitado el responsable y se ha enviado el correo informativo.");
				obj.getPersona().setEstado_validacion("1");
				obj.setEstado_habilitado(1);
			}
			// FIN: HABILITAR los datos
			
			// INICIO: INVALIDAR los datos
			if (accion.equals("INVALIDAR")) {
//				System.out.println(accion + "=========================");
				// Invalidamo los datos del responsable
				capacidadesService.grabarInvalidacion(obj.getPersona(),
						idEjecutora);
				capacidadesService.grabarInhabilitacion(obj);
				obj.setMensaje_usuario("Se ha invalidado al responsable.");
				obj.getPersona().setEstado_validacion("0");
				obj.setMostrar_grp_habilitar(0);
				obj.setMostrar_btn_habilitar(0);

				List<Etapa> etapasNivelGobierno = null;
				int nro_funcionesP = 0;

				// if(idResponsable.equals(0)){
				etapasNivelGobierno = capacidadesService
						.ObtenerEtapasNivelGobiernoSA(idNivelGobierno,
								idEjecutora, isFuncionesPersonalizadas,
								id_sistema_etapa);
				nro_funcionesP = capacidadesService.ObtenerNroFuncionesP(
						idNivelGobierno, idEjecutora);
				// }else{
				// nro_funcionesP =
				// capacidadesService.ObtenerNroFuncionesP(idNivelGobierno,idEjecutora);
				// etapasNivelGobierno=
				// capacidadesService.ObtenerEtapasNivelGobiernoSA(idNivelGobierno,idEjecutora,isFuncionesPersonalizadas,id_sistema_etapa);
				// }

				if (nro_funcionesP > 0) {
					obj.setCantida_funcionesP(nro_funcionesP);
				} else {
					obj.setCantida_funcionesP(0);
				}

				boolean tieneOperadores = capacidadesService
						.TieneOperadoresAsignados(idEjecutora);
				if (tieneOperadores) {
					obj.setTiene_Operadores(1);
				} else {
					obj.setTiene_Operadores(0);
				}

				obj.setEtapasNivelGobierno(etapasNivelGobierno);
			}
			// FIN: INVALIDAR los datos

			// INICIO: DESASIGNAR los datos
			if (accion.equals("DESASIGNAR")) {
				// Desasigno al responsable y sus operadores registrados
				censoService.grabarDesasignacion(obj);
				obj.setMensaje_usuario("Se ha desaginado al responsable y sus operadores.");
				obj.getResponsable().setAsignado("0");
				obj.getResponsable().setId_ejecutora(0);
				obj.setMostrar_grp_habilitar(0);
				obj.setMostrar_btn_habilitar(0);
				obj.setDesasignado(1);
				List<Etapa> etapasNivelGobierno = null;
				int nro_funcionesP = 0;

				if (idResponsable.equals(0)) {
					etapasNivelGobierno = capacidadesService
							.ObtenerEtapasNivelGobiernoSA(idNivelGobierno,
									idEjecutora, isFuncionesPersonalizadas,
									id_sistema_etapa);
					nro_funcionesP = capacidadesService.ObtenerNroFuncionesP(
							idNivelGobierno, idEjecutora);
				} else {
					nro_funcionesP = capacidadesService.ObtenerNroFuncionesP(
							idNivelGobierno, obj.getResponsable()
									.getId_ejecutora());
					etapasNivelGobierno = capacidadesService
							.ObtenerEtapasNivelGobiernoSA(idNivelGobierno, obj
									.getResponsable().getId_ejecutora(),
									isFuncionesPersonalizadas, id_sistema_etapa);
				}

				if (nro_funcionesP > 0) {
					obj.setCantida_funcionesP(nro_funcionesP);
				} else {
					obj.setCantida_funcionesP(0);
				}

				boolean tieneOperadores = capacidadesService
						.TieneOperadoresAsignados(idEjecutora);
				if (tieneOperadores) {
					obj.setTiene_Operadores(1);
				} else {
					obj.setTiene_Operadores(0);
				}

				obj.setEtapasNivelGobierno(etapasNivelGobierno);

			}
			// FIN: DESASIGNAR los datos

			// INICIO: FINALIZAR los datos
			if (accion.equals("FINALIZAR")) {
//				System.out.println(accion + "=========================");
				censoService.finalizarInscripcionParticipantes(obj);
				capacidadesService.mailFinalizaCenso(idResponsable, idSistema,
						idAmbito);
				obj.setEstado_habilitado(2);
				obj.setMensaje_usuario("Se ha finalizado el registro de Participantes.");
			}
			// FIN: FINALIZAR los datos

			// INICIO: GRABAR_PROFESION los datos
			if (accion.equals("GRABAR_PROFESION")) {
//				System.out.println(accion + "=========================");
				String profesion_descripcion = request
						.getParameter("profesion_descripcion");
				String cod_profesion = null;
				if (!request.getParameter("cod_profesion").equals(""))
					cod_profesion = request.getParameter("cod_profesion");
				Profesion profesion = new Profesion();
				profesion
						.setDesc_profesion(profesion_descripcion.toUpperCase());
				profesion.setCod_profesion(cod_profesion);
				cod_profesion = mantenimientoService.grabarProfesion(profesion);
				obj.setMensaje_usuario("Datos grabados correctamente.");
				obj.setProfesions(capacidadesService.ObtenerProfesion());
			}
			// FIN: GRABAR_PROFESION los datos

			// INICIO: BORRAR_PROFESION los datos
			if (accion.equals("BORRAR_PROFESION")) {
//				System.out.println(accion + "=========================");
				if (request.getParameter("cod_profesion") != null
						&& !request.getParameter("cod_profesion").equals("")) {
					String cod_profesion = request
							.getParameter("cod_profesion");
					String mensajeUsuario = mantenimientoService
							.validarEliminarProfesion(cod_profesion);
					if (mensajeUsuario.equals("")) {
						mantenimientoService.eliminarProfesion(cod_profesion);
						mensajeUsuario = "Profesión eliminada correctamente";
						obj.setProfesions(capacidadesService.ObtenerProfesion());
					}
					obj.setMensaje_usuario(mensajeUsuario);

				}
			}
			// FIN: BORRAR_PROFESION los datos

			// INICIO: GRABAR_REGIMEN los datos
			if (accion.equals("GRABAR_REGIMEN")) {
//				System.out.println(accion + "=========================");
				String regimen_descripcion = request
						.getParameter("regimen_descripcion");
				String cod_regimen = null;
				if (!request.getParameter("cod_regimen").equals(""))
					cod_regimen = request.getParameter("cod_regimen");
				Regimen regimen = new Regimen();
				regimen.setDesc_regimen(regimen_descripcion.toUpperCase());
				regimen.setCod_regimen(cod_regimen);
				cod_regimen = mantenimientoService.grabarRegimen(regimen);
				obj.setMensaje_usuario("Datos grabados correctamente.");
				obj.setRegimens(capacidadesService.ObtenerRegimen());
			}
			// INICIO: GRABAR_REGIMEN los datos

			// INICIO: BORRAR_REGIMEN los datos
			if (accion.equals("BORRAR_REGIMEN")) {
//				System.out.println(accion + "=========================");
				if (request.getParameter("cod_regimen") != null
						&& !request.getParameter("cod_regimen").equals("")) {
					String cod_regimen = request.getParameter("cod_regimen");
					String mensajeUsuario = mantenimientoService
							.validarEliminarRegimen(cod_regimen);
					if (mensajeUsuario.equals("")) {
						mantenimientoService.eliminarRegimen(cod_regimen);
						mensajeUsuario = "Profesion eliminada correctamente";
						obj.setRegimens(capacidadesService.ObtenerRegimen());
					}
					obj.setMensaje_usuario(mensajeUsuario);

				}
			}
			// FIN: BORRAR_REGIMEN los datos

			// if (redirect != "")
			// {
			// try {
			// response.sendRedirect(response
			// .encodeRedirectURL(redirect));
			// } catch (Exception e) {
			// return null;
			// }
			// }
		}
		// FIN: Procedemos con la acciones

		if (obj.getResponsable().getCorreo() != null)
			obj.getResponsable().setCorreo(
					obj.getResponsable().getCorreo().toLowerCase());

		if (obj.getResponsable().getId_responsable() == null)
			obj.getResponsable().setId_responsable(0);

		/*
		 * @JZM-04022013 Arson Se añade el código duplicado para obtener los
		 * datos de habilitación
		 */
//		System.out.println("isFuncionesPersonalizadas (99) = " + obj.getIsFuncionesPersonalizadas());
		responsableActual = capacidadesService.GetResponsable(idResponsable
				.intValue());
		ambitosResponsable = capacidadesService
				.ObtenerAmbitosResponsable(idResponsable);
		if (responsableActual != null) {
			obj.getResponsable().setEstado_registro(
					responsableActual.getEstado_registro());
			obj.getResponsable().setFec_fin_censo(
					responsableActual.getFec_fin_censo());
			obj.getResponsable().setFec_habilitacion(
					responsableActual.getFec_habilitacion());
		}
		return obj;
	}
}
